export const isEmpty = val => {
  return val === '' || val === undefined || val === null
}

// /**
//  * @name: 根据目录动态注册配置组件
//  * @return {Object} 动态注册的组件名及对应引入的组件文件，可直接用于Vue中的components属性中
//  */
// export function dynamicComponents() {
//   let components = {}
//   const dycomponent = require.context('@/components/ComponentsConfig', true, /\.vue$/)
//   dycomponent.keys().map(item => {
//     // 动态注册组件对应的配置文件
//     const name = item.split('/')[1]
//     components[name] = dycomponent(item).default
//   })
//   return components
// }


// 跨源通信
export class Messager{
  constructor(targetOrigin){
    //添加地址到实例上
    this.targetOrigin=targetOrigin
    //接收数据
    this.actions={}
    //监听传送数据的函数
     this.messageListener=(event)=>{
      //even为传过来的数据
          const type=event.data && event.data.type
          //当满足以下条件的时候 把数据丢入on里的回调函数cb中
          if (event.origin===this.targetOrigin && type && this.actions[type]) {
            this.actions[type](event.data.value)
          }
     }
     //监听crs回传的消息
     window.addEventListener('message',this.messageListener)
  }
  //监听数据
  on(type,cb){
    this.actions[type]=cb
    //方便链式操作 return this
    return this  
  }

  //发送给crs的数据
  emit(type,value){
    //获取crs窗口的window对象
     var win= document.getElementById('previewIframe').contentWindow
     //通过postMessage方式实现跨源通信
     win.postMessage({
      type,value
     },this.targetOrigin)
     return this
  }

   //移除消息的监听
   destroy(){
    window.removeEventListener('message')
   }

}



/**
 * 防抖函数，高频操作在指定时间间隔内只执行最后一次
 * @param  {Function}     func     要进行防抖的函数
 * @param  {Number}       wait     防抖间隔的时间，毫秒数
 * @param  {Boolean}      immediate     首次触发时是否立即执行
 * @return {Function}              返回防抖控制后的执行函数
 */
export function debounce(func, wait = 500, immediate) {
  let timer
  return function () {
    let context = this
    let arg = arguments

    if (immediate) {
      func.apply(context, arg)
      immediate = false
      return
    }

    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      func.apply(context, arg)
    }, wait)
  }
}

/**
 * 节流函数，高频操作在指定时间间隔内只执行一次
 * @param  {Function}     func     要进行节流的函数
 * @param  {Number}       wait     节流间隔的时间，毫秒数
 * @param  {Boolean}      immediate     首次触发时是否立即执行
 * @return {Function}              返回节流控制后的执行函数
 */
export function throttle(func, wait = 500, immediate) {
  let timer
  return function () {
    let context = this
    let arg = arguments

    if (immediate) {
      func.apply(context, arg)
      immediate = false
      return
    }

    if (timer) return
    timer = setTimeout(() => {
      func.apply(context, arg)
      timer = null
    }, wait)
  }
}

/**
 * 生成随机id 添加组件时生成
 */
export function createRandomId() {
  return Number(Math.random().toString().substr(3, 5) + Date.now()).toString(36)
}

//根据目录动态注册配置组件
export function dynamicComponents(){
  const component={}
  const dynamic=require.context('@/components/ComponentsConfig',true,/\.vue$/)
  //遍历 拿到目录里的文件路径
  dynamic.keys().map(item=>{
    //拿到第二个元素 
    const name= item.split('/')[1]
    //把拿到的组件数据传入对象中
    component[name]=dynamic(item).default
    // console.log(item,'damn',dynamic(item));
  })
  //return出来 然后在需要的页面注册组件的时候解构出来
  return component
}